package main

import "fmt"

func main() {
	sliceOperation()
}

func slice() {
	x := []int{2, 3, 5, 7, 11}
	fmt.Printf("len值 %d", len(x))
	fmt.Printf("cap值 %d", cap(x))
}

func makeTest() {
	a := make([]int, 2)
	b := make([]int, 2, 10)
	fmt.Println(a, b)
	fmt.Println(len(a), len(b))
	fmt.Println(cap(a), cap(b))
}

/**
  切片定义方式
*/
func sliceDefinition() {
	var (
		a []int               // nil切片, 和 nil 相等, 一般用来表示一个不存在的切片
		b = []int{}           // 空切片, 和 nil 不相等, 一般用来表示一个空的集合
		c = []int{1, 2, 3}    // 有3个元素的切片, len和cap都为3
		d = c[:2]             // 有2个元素的切片, len为2, cap为3，从c中切了俩个元素，但是容量没变
		e = c[0:2:cap(c)]     // 有2个元素的切片, len为2, cap为3
		f = c[:0]             // 有0个元素的切片, len为0, cap为3
		g = make([]int, 3)    // 有3个元素的切片, len和cap都为3
		h = make([]int, 2, 3) // 有2个元素的切片, len为2, cap为3
		i = make([]int, 0, 3) // 有0个元素的切片, len为0, cap为3
	)
	print(a, b, c, d, e, f, g, h, i)
}

/**
  切片遍历
*/
func sliceIterate() {
	var a = []int{1, 4, 5}

	for i := range a {
		fmt.Printf("b[%d]: %d \n", i, a[i])
	}
	for i, v := range a {
		fmt.Printf("b[ %d]: %d \n", i, v)
	}
	for i := 0; i < len(a); i++ {
		fmt.Printf("b [ %d]: %d \n", i, a[i])
	}
}

/**
  切片操作
*/
func sliceOperation() {
	fmt.Println("在切片的尾部追加")
	var a = []int{1, 4, 5}
	a = append(a, 6)                 // 追加1个元素,元素为6
	a = append(a, 1, 2, 3)           // 追加多个元素
	a = append(a, []int{1, 2, 3}...) // 追加一个切片, 切片需要解包
	fmt.Println(a)
	fmt.Println("在切片的头部追加")
	var b = []int{1, 4, 5}
	b = append([]int{7}, b...) // 在开头添加1个元素 a = append([]int{-3,-2,-1}, a...) // 在开头添加1个切片
	fmt.Println(b)
	fmt.Println("删除尾部元素")
	var c = []int{1, 2, 3, 6, 5, 2}
	c = c[:len(c)-1] // 删除尾部1个元素
	c = c[:len(c)-2] // 删除尾部N个元素
	fmt.Println(c)
	fmt.Println("删除开头元素")
	var d = []int{1, 2, 3, 6, 8, 1}
	d = d[1:] // 删除开头1个元素
	d = d[2:] // 删除开头N个元素
	fmt.Println(d)
}
